package com.dctp.common.utils;

import java.nio.ByteBuffer;
import java.util.Base64;
import java.util.UUID;

/**
 * UUID 工具类（线程安全）
 */
public class UUIDUtil {

    /**
     * 生成随机UUID（标准36位带连字符格式）
     */
    public static String randomUUID() {
        return UUID.randomUUID().toString();
    }

    /**
     * 生成32位无连字符UUID（全小写）
     */
    public static String random32() {
        return UUID.randomUUID().toString().replaceAll("-", "");
    }

    /**
     * 生成32位无连字符大写UUID
     */
    public static String random32UpperCase() {
        return random32().toUpperCase();
    }

    /**
     * 生成基于时间的UUID（Version 1，需第三方库支持）
     * 注意：JDK 原生不支持V1 UUID，这里给出示例接口
     */
    public static String timeBasedUUID() {
        // 实际需依赖如 Apache Commons 或 JUG (Java UUID Generator)
        // 示例实现：
        // return com.fasterxml.uuid.Generators.timeBasedGenerator().generate().toString();
        throw new UnsupportedOperationException("需要引入第三方库实现");
    }

    /**
     * 生成有序UUID（优化存储性能）
     * 将标准UUID转换为16进制有序字符串
     */
    public static String orderedUUID() {
        UUID uuid = UUID.randomUUID();
        return String.format("%016d%016d", 
            uuid.getMostSignificantBits(), 
            uuid.getLeastSignificantBits());
    }

    /**
     * 校验UUID合法性
     */
    public static boolean isValidUUID(String uuid) {
        if (uuid == null) return false;
        String regex = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$";
        return uuid.matches(regex);
    }


    /**
     * 生成24位URL安全的Base64 UUID（带填充符）
     * 示例输出：gqXy7Z8kREe6T7hM6Jj3hQ==
     */
    public static String random24() {
        UUID uuid = UUID.randomUUID();
        // 将UUID转换为16字节数组
        byte[] uuidBytes = new byte[16];
        ByteBuffer buffer = ByteBuffer.wrap(uuidBytes);
        buffer.putLong(uuid.getMostSignificantBits());
        buffer.putLong(uuid.getLeastSignificantBits());
        // 使用URL安全Base64编码（带填充符）
        return Base64.getUrlEncoder().encodeToString(uuidBytes);
    }

    /**
     * 生成24位URL安全的Base64 UUID（无填充符，实际为22位）
     * 示例输出：gqXy7Z8kREe6T7hM6Jj3hQ
     */
    public static String random24WithoutPadding() {
        UUID uuid = UUID.randomUUID();
        byte[] uuidBytes = new byte[16];
        ByteBuffer.wrap(uuidBytes)
                .putLong(uuid.getMostSignificantBits())
                .putLong(uuid.getLeastSignificantBits());
        // 使用URL安全Base64编码（移除填充符）
        return Base64.getUrlEncoder().withoutPadding().encodeToString(uuidBytes);
    }

    // 禁止实例化
    private UUIDUtil() {}
}